Nested Object Mapping হল এমন একটি প্রক্রিয়া যেখানে একটি অবজেক্টের মধ্যে থাকা একটি বা একাধিক সাব অবজেক্ট (nested objects) এর মধ্যে ডেটা ম্যাপিং করা হয়। MapStruct এর মাধ্যমে, আপনি nested অবজেক্টগুলির মধ্যে ডেটা ট্রান্সফার বা ম্যাপিং খুব সহজে করতে পারেন। MapStruct এই প্রক্রিয়াটি compile-time code generation এর মাধ্যমে সম্পন্ন করে, ফলে এটি দ্রুত এবং পারফর্ম্যান্সে দক্ষ হয়।
এখানে, Nested Object Mapping এর ধারণা ব্যাখ্যা করা হবে এবং উদাহরণসহ কিভাবে এটি MapStruct এর মাধ্যমে করা যায়, তা দেখানো হবে।
১. Nested Object Mapping কি?
Nested Object Mapping এর মাধ্যমে, আপনি একটি অবজেক্টের মধ্যে থাকা একাধিক সাব অবজেক্ট (যা একটি ডোমেইন অবজেক্ট হতে পারে) এর মধ্যে ডেটা ম্যাপিং করতে পারেন। উদাহরণস্বরূপ, ধরুন আপনার একটি Customer ক্লাস রয়েছে, যার মধ্যে একটি Address নামক সাব অবজেক্ট রয়েছে। আপনি যদি Customer থেকে CustomerDTO তে ডেটা ম্যাপ করতে চান এবং সাথে Address অবজেক্টের মানও ম্যাপ করতে চান, তাহলে এটি Nested Object Mapping হিসেবে পরিচিত।
২. Nested Object Mapping উদাহরণ
ধরা যাক, আমাদের দুটি ক্লাস রয়েছে: Customer এবং Address। আমাদের Customer অবজেক্ট থেকে CustomerDTO তে ডেটা ম্যাপ করতে হবে, এবং Address সাব অবজেক্টটিও ম্যাপ করতে হবে।
২.১ Customer এবং Address ক্লাস তৈরি করা
Customer.java:
public class Customer {
private String name;
private Address address;
// Getters and Setters
}
Address.java:
public class Address {
private String city;
private String street;
// Getters and Setters
}
CustomerDTO.java:
public class CustomerDTO {
private String name;
private String city;
private String street;
// Getters and Setters
}
এখানে, Customer ক্লাসের মধ্যে একটি Address অবজেক্ট রয়েছে, এবং CustomerDTO তে Address এর city এবং street মান ম্যাপ করতে হবে।
২.২ MapStruct Mapper Interface তৈরি করা
এখন, MapStruct ব্যবহার করে আমরা একটি Mapper Interface তৈরি করব, যা Customer থেকে CustomerDTO তে ডেটা ম্যাপ করবে।
CustomerMapper.java:
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
@Mapper
public interface CustomerMapper {
CustomerMapper INSTANCE = Mappers.getMapper(CustomerMapper.class);
// Mapping method for Customer to CustomerDTO
@Mapping(source = "address.city", target = "city")
@Mapping(source = "address.street", target = "street")
CustomerDTO customerToCustomerDTO(Customer customer);
}
এখানে, @Mapping অ্যানোটেশন ব্যবহার করা হয়েছে, যা Address এর city এবং street প্রপার্টি CustomerDTO এর city এবং street প্রপার্টিতে ম্যাপ করবে।
২.৩ CustomerMapper ব্যবহার করা
এখন, CustomerMapper ব্যবহার করে Customer অবজেক্টের ডেটা CustomerDTO তে ম্যাপ করা হবে।
Main.java:
public class Main {
public static void main(String[] args) {
// Create Customer object with Address
Address address = new Address();
address.setCity("Dhaka");
address.setStreet("Gulshan");
Customer customer = new Customer();
customer.setName("John Doe");
customer.setAddress(address);
// Map Customer to CustomerDTO
CustomerDTO customerDTO = CustomerMapper.INSTANCE.customerToCustomerDTO(customer);
System.out.println("Customer Name: " + customerDTO.getName());
System.out.println("Customer City: " + customerDTO.getCity());
System.out.println("Customer Street: " + customerDTO.getStreet());
}
}
এখানে, CustomerMapper.INSTANCE.customerToCustomerDTO(customer) মাধ্যমে Customer অবজেক্ট থেকে CustomerDTO তে ডেটা ম্যাপ করা হয়েছে। Address এর city এবং street ডেটাও সঠিকভাবে ম্যাপ করা হয়েছে।
৩. Nested Object Mapping এর সুবিধা
- Compile-time Code Generation: MapStruct compile-time এ কোড জেনারেট করে, যার ফলে কোন runtime overhead থাকে না এবং পারফরম্যান্স দ্রুত হয়।
- No Reflection: MapStruct Reflection ব্যবহার করে না, তাই এটি দ্রুত এবং টাইপ-সেফ ম্যাপিং প্রদান করে।
- Customizable Mapping: MapStruct কাস্টম ম্যাপিং এর সুযোগ প্রদান করে। যেমন, আপনি
cityএর মানaddressCityএ ম্যাপ করতে চাইলে কাস্টম ম্যাপিং ব্যবহার করতে পারবেন। - Complex Nested Mappings: এটি আরও জটিল nested মডেল ম্যাপিং পরিচালনা করতে সাহায্য করে, যেমন List বা Set ম্যাপিং।
৪. Complex Nested Mapping Example
ধরা যাক, আমাদের একটি Company ক্লাস রয়েছে, যার মধ্যে একাধিক Employee অবজেক্ট রয়েছে এবং তাদের Address সাব অবজেক্ট রয়েছে। এখানে Company থেকে CompanyDTO তে ডেটা ম্যাপ করতে হবে।
৪.১ Company, Employee, এবং Address ক্লাস তৈরি করা
Company.java:
import java.util.List;
public class Company {
private String name;
private List<Employee> employees;
// Getters and Setters
}
Employee.java:
public class Employee {
private String name;
private Address address;
// Getters and Setters
}
Address.java:
public class Address {
private String city;
private String street;
// Getters and Setters
}
CompanyDTO.java:
import java.util.List;
public class CompanyDTO {
private String companyName;
private List<EmployeeDTO> employees;
// Getters and Setters
}
EmployeeDTO.java:
public class EmployeeDTO {
private String name;
private String city;
private String street;
// Getters and Setters
}
৪.২ MapStruct Mapper Interface for Nested Mapping
এখন, Company থেকে CompanyDTO তে ম্যাপিং করতে হলে, Employee এবং Address অবজেক্টের জন্যও ম্যাপিং করতে হবে।
CompanyMapper.java:
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
import java.util.List;
@Mapper
public interface CompanyMapper {
CompanyMapper INSTANCE = Mappers.getMapper(CompanyMapper.class);
@Mapping(source = "name", target = "companyName")
@Mapping(source = "employees", target = "employees")
CompanyDTO companyToCompanyDTO(Company company);
// Nested mapping for Employee
@Mapping(source = "address.city", target = "city")
@Mapping(source = "address.street", target = "street")
EmployeeDTO employeeToEmployeeDTO(Employee employee);
}
এখানে, আমরা CompanyMapper তৈরি করেছি যাতে Company থেকে CompanyDTO তে এবং Employee থেকে EmployeeDTO তে ডেটা ম্যাপ করা যায়। Employee ক্লাসের মধ্যে Address সাব অবজেক্টের জন্য কাস্টম ম্যাপিং ব্যবহৃত হয়েছে।
৪.৩ Main.java for Complex Nested Mapping
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
// Create Address
Address address = new Address();
address.setCity("Dhaka");
address.setStreet("Gulshan");
// Create Employee
Employee employee = new Employee();
employee.setName("Alice");
employee.setAddress(address);
// Create Company
Company company = new Company();
company.setName("Tech Corp");
company.setEmployees(Arrays.asList(employee));
// Map Company to CompanyDTO
CompanyDTO companyDTO = CompanyMapper.INSTANCE.companyToCompanyDTO(company);
// Output
System.out.println("Company Name: " + companyDTO.getCompanyName());
companyDTO.getEmployees().forEach(emp -> {
System.out.println("Employee Name: " + emp.getName());
System.out.println("Employee City: " + emp.getCity());
System.out.println("Employee Street: " + emp.getStreet());
});
}
}
এখানে, CompanyMapper.INSTANCE.companyToCompanyDTO(company) এর মাধ্যমে Company থেকে CompanyDTO তে ম্যাপিং করা হয়েছে এবং Employee এবং Address এর ডেটাও সঠিকভাবে ম্যাপ হয়েছে।
সারাংশ
Nested Object Mapping MapStruct এর একটি শক্তিশালী ফিচার, যা আপনাকে nested অবজেক্টগুলির মধ্যে ডেটা ট্রান্সফার বা ম্যাপিং করতে সহায়তা করে। MapStruct এর মাধ্যমে সহজে, টাইপ-সেফ এবং পারফরম্যান্স